/**
 * 
 */
package com.zxc.utils;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.Map;

/**
 * 工具类
 * @author zhaoxinchun 2015年8月21日 上午9:26:15
 *
 */
public class Utility {
	
	
	/**
	 * 空转换为BIGDECIMAL 0 
	 * @param num
	 * @return
	 */
	public static BigDecimal nullToBigDecimal(BigDecimal num){
		return num == null ? BigDecimal.valueOf(0) : num;
	}
	
	/** 
	 * 判断两个bigdecimal数值是否相等
	 * @param firstNum
	 * @param secondNum
	 * @return
	 * @author zhaoxinchun 2015年12月23日 下午4:29:55
	 */
	public static boolean isEquals(BigDecimal firstNum,BigDecimal secondNum){
		return decimalSubstract(firstNum, secondNum).compareTo(BigDecimal.ZERO) == 0;
	}
	
	/** 
	 * 向上取整
	 * @param num
	 * @return
	 * @author zhaoxinchun 2015年12月29日 上午10:01:00
	 */
	public static BigDecimal ceilToBigDecimal(BigDecimal num){
		return BigDecimal.valueOf(Math.ceil(nullToBigDecimal(num).doubleValue()));
	}
	
	/** 
	 * 向下取整
	 * @param num
	 * @return
	 * @author zhaoxinchun 2016年3月15日 下午4:20:14
	 */
	public static BigDecimal floorToBigDecimal(BigDecimal num){
		return BigDecimal.valueOf(Math.floor(nullToBigDecimal(num).doubleValue()));
	}
	
	/** 
	 * 两个bigdecimal数值求余（firstnum%secondnum）
	 * @param firstNum
	 * @param secondNum
	 * @return
	 * @author zhaoxinchun 2016年3月15日 下午4:21:49
	 */
	public static BigDecimal decimalRemainder(BigDecimal firstNum,BigDecimal secondNum){
		return nullToBigDecimal(firstNum).remainder(nullToBigDecimal(secondNum));
	}
	
	/** 
	 * 泰国5进位处理方法<br>
	 * 1.将num向下取整<br>
	 * 2.将取整后的num%10,获取个位数值<br>
	 * 3.if 个位数值  小于 5 then num取整后-个位数<br>
	 * 4.if 个位数值  大于 5 then num取整后-个位数+5<br>
	 * 5.else num取整
	 * @param num
	 * @return
	 * @author zhaoxinchun 2016年3月15日 下午4:34:20
	 */
	public static BigDecimal fiveToBigDecimal(BigDecimal num){
		BigDecimal unitNum = decimalRemainder(floorToBigDecimal(num), BigDecimal.TEN);
		if(unitNum.intValue() < 5){
			return decimalSubstract(floorToBigDecimal(num), unitNum);
		}else if(unitNum.intValue() > 5){
			return decimalAdd(decimalSubstract(floorToBigDecimal(num), unitNum), BigDecimal.valueOf(5));
		}
		return floorToBigDecimal(num);
	}
	
	/** 
	 * 两个bigdecimal数值求差（firstnum-secondnum）
	 * @param firstNum
	 * @param secondNum
	 * @return
	 * @author zhaoxinchun 2015年12月23日 下午4:31:22
	 */
	public static BigDecimal decimalSubstract(BigDecimal firstNum,BigDecimal secondNum){
		return nullToBigDecimal(firstNum).subtract(nullToBigDecimal(secondNum));
	}
	
	/** 
	 * 两个bigdecimal数值求和
	 * @param firstNum
	 * @param secondNum
	 * @return
	 * @author zhaoxinchun 2015年12月29日 上午10:06:23
	 */
	public static BigDecimal decimalAdd(BigDecimal firstNum,BigDecimal secondNum){
		return nullToBigDecimal(firstNum).add(nullToBigDecimal(secondNum));
	}
	
	/** 
	 * 求除，firstNum/secondNum
	 * @param firstNum
	 * @param secondNum
	 * @return
	 * @author zhaoxinchun 2016年1月12日 下午7:59:11
	 */
	public static BigDecimal decimalDivide(BigDecimal firstNum,BigDecimal secondNum){
		return nullToBigDecimal(firstNum).divide(nullToBigDecimal(secondNum),4, BigDecimal.ROUND_HALF_EVEN);
	}
	
	/** 
	 * 乘法，firstNum*secondNum
	 * @param firstNum
	 * @param secondNum
	 * @return
	 * @author zhaoxinchun 2016年1月27日 下午6:47:22
	 */
	public static BigDecimal decimalMultiply(BigDecimal firstNum,BigDecimal secondNum){
		return nullToBigDecimal(firstNum).multiply(nullToBigDecimal(secondNum));
	}
	
	/**
	 * 字符串转BigDecimal
	 * @param num
	 * @return
	 */
	public static BigDecimal stringToBigDecimal(String num){
		return new BigDecimal(isEmpty(num) ? "0" : num);
	}
	
	public static boolean isEmpty(String str){
		return str == null || str.length()==0 ? true : false;
	}
	
	/**
	 * 字符串转Integer
	 * @param num
	 * @return
	 */
	public static Integer stringToInteger(String num){
		return Integer.valueOf(isEmpty(num) ? "0" : num);
	}
	
	/** 
	 * 字符串转Byte
	 * @param num
	 * @return
	 * @author zhaoxinchun 2016年1月27日 下午6:11:43
	 */
	public static Byte stringToByte(String num){
		return Byte.valueOf(isEmpty(num) ? "0" : num);
	}
	
	/** 
	 * 单人税进位取整后累加成总税金
	 * @param tax
	 * @param num
	 * @return
	 * @author zhaoxinchun 2016年3月17日 下午4:13:20
	 */
	public static BigDecimal ceilToDecimalForSingleTax(BigDecimal tax,Integer num){
		
		if(num == null || num == 0){
			return tax;
		}
		
		return Utility.decimalMultiply(Utility.ceilToBigDecimal(Utility.decimalDivide(tax, BigDecimal.valueOf(num))), BigDecimal.valueOf(num));
	}
	
	
	/**
	 * 回收collection集合的内存空间
	 * @param collection
	 */
	public static void gccList(Collection<?> collection){
		collection.clear();
		collection = null;
	}
	
	/**
	 * 回收Map集合的内存空间
	 * @param map
	 */
	public static void gccMap(Map<?, ?> map){
		map.clear();
		map = null;
	}
	
	/**
	 * 回收对象的内存空间
	 * @param obj
	 */
	public static void gccObj(Object obj){
		obj = null;
	}
	
	public static void main(String[] args) {
		Date d = new Date();
		System.out.println(d.toString());
		
		System.out.println(new Date(d.getTime()).toString());
	}
}
